﻿#pragma once

#include "util/c99defs.hpp"
#include "cat-data.hpp"
#include "cat-source.hpp"

#ifdef __cplusplus
extern "C" {
#endif

	struct cat_module;
	struct cat_source;
	struct cat_source_info;
	struct cat_window;

	
	typedef struct cat_module cat_module_t;
	typedef struct cat_source cat_source_t;
	typedef struct cat_source_info cat_source_info_t;
	typedef struct cat_window cat_window_t;

	/**
	*	返回核心版本号
	*/
	EXPORT const char* cat_get_version_string();
	
	/**
	*	初始化猫猫运行环境
	*   config_path: 需要加载的cofig路径
	*   default_config：初始化需要的config信息
	*/
	EXPORT bool cat_startup(const char* config_path,const char * default_config);

	/**
	*	释放所有猫猫环境及资源
	*/
	EXPORT void cat_shutdown(void);
	
	/**
	*	返回true如果猫猫已经被初始化
	*/
	EXPORT bool cat_initailized(void);
	/******************************************************************************/
	/**
	*	设置初始化的回调函数
	*/
	EXPORT void cat_set_on_init(void(*cat_on_init)());

	/**
	*	设置 cat_draw_cat的回调函数
	*/
	EXPORT void cat_set_draw_func(void(*cat_draw)());

	/******************************************************************************/
	/*
	*  初始化猫猫后, 加载 default config文件
	*/
	EXPORT cat_data_t* cat_load_default_config();

	EXPORT bool cat_save_default_config();

	/*
	*   default config 路径
	*/
	EXPORT const char* cat_get_default_config_path();

	/*
	*  初始化猫猫后, 更新default_config
	*/
	EXPORT void update_config();

	/*
	*  初始化猫猫后, 更新default_config
	*/
	EXPORT void update_config_from_config_file(const char* path);

	EXPORT cat_data_t* cat_get_buffer_config();

	EXPORT void update_config_from_buffer_config();

	EXPORT void update_buffer_config_from_config();

	EXPORT void update_buffer_config_from_data(cat_data_t* newData);

	/******************************************************************************/
	/*
	* 加载字体
	*/
	EXPORT bool cat_set_cat_font(const char* fontpath);
	/******************************************************************************/
	/*
	*	打开图形界面
	*/
	EXPORT bool cat_open_gui(const char* title, const char* icon);
	/*
	*	画猫猫
	*/
	EXPORT void cat_draw_cat();

	/*
	*	显示图形界面
	*/
	EXPORT bool cat_display_gui();

	EXPORT void cat_shatdown_gui();
	/*
	*	关闭图形界面
	*/
	EXPORT void cat_close_gui();

	/*
	*	图形界面隐藏与否
	*/
	EXPORT void cat_set_gui_visible(bool _flag);

	EXPORT void cat_set_gui_size(int width,int height);

	/*
	*	得到句柄
	*/


	EXPORT void * cat_get_handle();

	EXPORT void* cat_get_buffer_window_handle();

	/******************************************************************************/
	/*
	*	加载插件模块 不进行初始化 需要初始化 call cat_init_module方法
	*/
	EXPORT int cat_open_module(cat_module_t** module, const char* path,
		const char* data_path);
	/*
	*	初始化模块
	*/
	EXPORT bool cat_init_module(cat_module_t* module);
	/*
	*	打印所有加载的模块
	*/
	EXPORT void cat_log_loaded_modules(void);
	/******************************************************************************/
	/*
	*	添加模块路径
	*/
	EXPORT void cat_add_module_path(const char* bin, const char* data);
	/*
	*	从已添加的路径加载模块
	*/
	EXPORT void cat_load_all_module_from_path();

	/*
	*	从已添加的路径加载模块
	*/
	EXPORT void cat_release_all_module();
	/******************************************************************************/

	EXPORT cat_source_t* cat_source_create_internal(cat_source_info* info);
	/*
	*	为所有的添加模块信息
	*/
	EXPORT void cat_load_all_module_info();
	/*
	*	向hook里面注册事件
	*/
	EXPORT void cat_regist_event(cat_source_info* info);
	/*
	*	注销事件
	*/
	EXPORT void cat_fire_event(cat_source_info* info);
	/******************************************************************************/
	/*
	*	遍历所有模块
	*/
	typedef void (*cat_enum_module_callback_t)(void* param, cat_module_t* module);

	EXPORT void cat_enum_modules(cat_enum_module_callback_t callback, void* param);
	/*
	*	遍历mode模块
	*/
	EXPORT void cat_enum_mode(bool (*enum_proc)(void*, cat_source_t*),void* param);
	/*
	*	遍历input模块
	*/
	EXPORT void cat_enum_input(bool (*enum_proc)(void*, cat_source_t*), void* param);
	/*
	*	遍历output模块
	*/
	EXPORT void cat_enum_output(bool (*enum_proc)(void*, cat_source_t*), void* param);
	/*
	*	遍历ui模块
	*/
	EXPORT void cat_enum_ui(bool (*enum_proc)(void*, cat_source_t*), void* param);

	/******************************************************************************/
	/*
	*   获取当前mode 的id
	*/
	EXPORT int cat_get_curent_mode_id();

	/*
	*   设置当前mode的id
	*/
	EXPORT void cat_set_curent_mode_id(int i);

	/*
	*	初始化mode模块
	*/
	EXPORT void cat_init_mode(int id);
	/*
	*	调用当前mode模块update方法
	*/
	EXPORT void cat_update_mode(int id);
	/*
	*	调用当前mode模块run方法
	*/
	EXPORT void cat_run_mode(int id);
	/*
	*	释放mode模块
	*/
	EXPORT void cat_release_mode(int id);
	/******************************************************************************/
	/*
	*	初始化所有input模块
	*/
	EXPORT void cat_init_input();
	/*
	*	更新所有input模块
	*/
	EXPORT void cat_update_input();
	/*
	*	调用所有input模块run方法
	*/
	EXPORT void cat_run_input();
	/*
	*	释放所有input模块
	*/
	EXPORT void cat_release_input();
	/******************************************************************************/
	/*
	*	初始化所有gui模块
	*/
	EXPORT void cat_init_ui();
	/*
	*	更新所有gui模块
	*/
	EXPORT void cat_update_ui();
	/*
	*	调用所有gui模块run方法
	*/
	EXPORT void cat_run_ui();
	/*
	*	释放所有gui模块
	*/
	EXPORT void cat_release_ui();
	/******************************************************************************/
	/*
	*	初始化所有output模块
	*/
	EXPORT void cat_init_output();
	/*
	*	更新所有output模块
	*/
	EXPORT void cat_update_output();
	/*
	*	调用所有gui模块output方法
	*/
	EXPORT void cat_run_output();
	/*
	*	释放所有output模块
	*/
	EXPORT void cat_release_output();
	/******************************************************************************/

	EXPORT void cat_play_sound(const char * filename,bool isStop);

#ifdef __cplusplus
}
#endif